package Form;

import java.util.Date;
import java.util.HashMap;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;

import Creche.Admin.Administrateur;
import Creche.Bd.BD;

public final class MailForm {
	
	private static final String CHAMP_EMAIL = "email";
	
	private String resultat;
    private HashMap<String,String> erreurs = new HashMap<String,String>();
    
    private Session session = null;
    private Transport transport = null;
    
    
    /**
     * @return le resultat du formulaire
     */
    public String getResultat() {
        return resultat;
    }
    
    
    /**
     * @return la map des erreurs saisis dans le formulaire
     */
    public HashMap<String,String> getErreurs() {
        return erreurs;
    }

    
    /**
     * Crée un administrateur après validation du formulaire 
     * @param requette de la servlet
     * @return administrateur
     */
    public Administrateur verifierAdmin(HttpServletRequest req) {
    	
    	String email = req.getParameter(CHAMP_EMAIL).trim();
     
        Administrateur admin = new Administrateur("key");
        BD myBD = new BD();
        
        /* Validation du champ email */
        try {
            validationEmail(email,myBD);
            admin.setEmail(email);
        } catch (Exception e) {
            setErreur(CHAMP_EMAIL, e.getMessage());
        }
        
        if (getErreurs().isEmpty()) {
        	resultat = "Email envoyé";
        }
        else {
        	resultat = "Echec de l'envoi";
        }
        
        return admin;
    }
    
    
    /**
     * Crée un message d'erreur si email invalide, non saisi ou non enregistré
     * @param email saisi par l'utilisateur
     * @param base de données
     */
    private void validationEmail(String email, BD myBD) throws Exception {
        if (!email.isEmpty()) {
            if (!email.matches( "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" )) {
                throw new Exception("Adresse email invalide");
            }
            else if (myBD.getAdmin(email) == null) {
            	throw new Exception("Vous n'êtes pas un administrateur");
            }
        } 
        else {
            throw new Exception("Veuillez saisir une adresse email");
        }
    }
    
    
    /**
     * Ajoute dans la map des erreurs le message correspondant au champ
     * @param champ du formulaire
     * @param message d'erreurs
     */
    private void setErreur(String champ, String message) {
        erreurs.put(champ, message);
    }
    
    
    /**
     * Fixe les propriétés pour se connecter
     * @param host serveur utilisé
     * @param user adresse du compte gmail
     * @param password mdp du compte gmail
     * @throws MessagingException
     */
    public void connect(String host, String user, String password) 
    		throws MessagingException {
    	
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.debug", "true");
        
        session = Session.getDefaultInstance(props, null);
        session = Session.getInstance(props, null);
        transport = session.getTransport("smtps");
        transport.connect(host, user, password);
    }

    
    /**
     * Permet l'envoi du mail
     * @param from adresse de l'émetteur
     * @param to adresse du destinataire
     * @param subject objet du mail
     * @param body texte du mail
     * @throws MessagingException
     */
    public void send(String from, String to, String subject, String body) 
    		throws MessagingException {
    	
    	Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        Message msg = new MimeMessage(session);
        
        msg.setSubject(subject);
        msg.setSentDate(new Date());
        msg.setContent(body, "text/plain");
        msg.setFrom(new InternetAddress(from));
        msg.addRecipient(Message.RecipientType.TO,  new InternetAddress(to));
        
        //transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
        Transport.send(msg);
        //transport.close();
    }
}